_______________________________________________________________ /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\ | Descriptions des fichiers xxxx.d3 faites par Luc Billard || | et légèrement annotées par Frédéric Lançon ( novembre 1999). || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' Fichier xxxx.d3 --------------- Un fichier xxxxx.d3 est un fichier décrivant une configuration atomique d'un alliage. Ce fichier doit avoir une structure particulière qui a été définie originellement par F. LANÇON, et est créé par une écriture Fortran sous la forme non formattée : spécificateur FORM = 'UNFORMATTED' dans l'instruction OPEN. De façon à assurer une portabilité entre les machines qui utilisent des conventions différentes pour l'écriture interne des données, nous imposons ici une spécification supplémentaire : les données doivent être écrites selon la convention 'big endian'; c'est la convention par défaut sur les machines Sun, mais ce n'est pas la convention par défaut sur les machines DEC. Donc, si vous créez un fichier xxxxx.d3 par un programme Fortran qui s'exécute sur DEC, vous devez : - soit compiler ce programme avec l'option -convert big_endian - soit utiliser l'extension DEC au Fortran 90 qui permet le spécificateur CONVERT = 'BIG_ENDIAN' dans l'instruction OPEN. Structure du fichier xxxxx.d3. (Rappel: chaque instruction Fortran WRITE écrit 1 et 1 seul enregistrement) 1er enregistrement: TITRE CHARACTER*128 TITRE : chaîne de 128 caractères 2ème enregistrement: NAT, NTYPE INTEGER*4 NAT : nombre d'atomes INTEGER*4 NTYPE : nombre de types d'atomes 3ème enregistrement: (NATI(I), I = 1, NTYPE), (NOM(I), I = 1, NTYPE) INTEGER*4 NATI(*) : nombre d'atomes de chacun des types 1...NTYPE CHARACTER*8 NOM(*) : noms des types 1...NTYPE 4ème enregistrement: DXX, DYX, DYY, DZX, DZY, DZZ REAL*8 DXX, DYX, DYY, DZX, DZY, DZZ : taille et forme de la boite La boîte parallèlépipédique étant définie par 3 vecteurs a, b et c, on appelle : DXX : projection sur X du vecteur a (a inclus dans la droite oX). DYX : projection sur X du vecteur b (b est inclus dans le plan XoY). DYY : projection sur Y du vecteur b. DZX : projection sur X du vecteur c. DZY : projection sur Y du vecteur c. DZZ : projection sur Z du vecteur c. 5ème enregistrement: (X(I), I = 1, NAT) REAL*8 X(*) : coordonnées X des atomes (les atomes sont rangés de sorte que les NATI(1) 1ers sont du type 1, les NATI(2) suivants sont du type 2, etc... 5ème enregistrement: (Y(I), I = 1, NAT) REAL*8 Y(*) : coordonnées Y des atomes 6ème enregistrement: (Z(I), I = 1, NAT) REAL*8 Z(*) : coordonnées Z des atomes Remarque: (F. LANÇON - /home/cannelle/lancon/UTILE_3D/fichier_d3.f) *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *condition pour qu'un point soit dans la maille élémentaire : *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * 0 < z < DZZ * * DZY z DZY z * ----- < y < DYY + ----- * DZZ DZZ * *DYX DZZ y + DYY DZX z - DYX DZY z DYX y DZX z DYX DZY z *--------------------------------- < x < DXX + ----- + ----- - --------- * DYY DZZ DYY DZZ DYY DZZ * *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Exemple: program d3 ! ATTENTION : pour compiler sur DEC, utiliser l'option : ! -convert big_endian ! construction d'un fichier xxxxx.d3 implicit none ! chaine de 128 caractères laissée à l'appréciation de l'utilisateur ! sauf qu'elle doit commencer par "Positions atomiques 3D. " character(len = 128) :: titre ! nombre d'atomes et nombre de types d'atomes integer :: nat, ntype ! nombres d'atomes de chacun des types integer, dimension(:), allocatable :: nati ! et noms de chacun des types character(len = 8), dimension(:), allocatable :: nom ! dimensions de la boite real(kind = 8) :: dxx, dyx, dyy, dzx, dzy, dzz ! coordonnées des atomes real(kind = 8), dimension(:), allocatable :: x, y, z integer :: n, i, j, k real(kind = 8) :: xx, yy, zz character(len = 128) ifich integer, parameter :: unit = 10 ! titre; exemple: titre = 'fichier test' ! nombre d'atomes; exemple: nat = 36 ! et nombre de types d'atomes; exemple: ntype = 2 ! allocation des tableaux allocate(nati(ntype)) if (.not. allocated(nati)) then write(*, *) 'Cannot allocate nati' stop endif allocate(nom(ntype)) if (.not. allocated(nom)) then write(*, *) 'Cannot allocate nom' stop endif allocate(x(nat)) if (.not. allocated(nom)) then write(*, *) 'Cannot allocate x' stop endif allocate(y(nat)) if (.not. allocated(nom)) then write(*, *) 'Cannot allocate y' stop endif allocate(z(nat)) if (.not. allocated(nom)) then write(*, *) 'Cannot allocate z' stop endif ! nombres d'atomes de chacun des types; exemple: nati(1) = 18 nati(2) = 18 ! et noms de chacun des types; exemple: nom(1) = 'atomes A' nom(2) = 'atomes B' ! dimensions de la boite; exemple: dxx = 3.d0 dyx = 0.d0 dyy = 3.d0 dzx = 0.d0 dzy = 0.d0 dzz = 4.d0 ! coordonnées des atomes ! d'abord les nati(1) atomes de type nom(1) n = 0 do i = 1, 3 xx = -0.5d0 + dble(i) do j = 1, 3 yy = -0.5d0 + dble(j) do k = 1, 4, 2 zz = -0.5d0 + dble(k) n = n + 1 x(n) = xx y(n) = yy z(n) = zz end do end do end do if ( n /= nati(1)) then write(*, *) 'erreur sur nati(1)' stop endif nati(1) = n do i = 1, 3 xx = -0.5d0 + dble(i) do j = 1, 3 yy = -0.5d0 + dble(j) do k = 2, 4, 2 zz = -0.5d0 + dble(k) n = n + 1 x(n) = xx y(n) = yy z(n) = zz end do end do end do if ( n /= nat) then write(*, *) 'erreur sur nat' stop endif ! note: je ne vérifie pas que j'ai bien mis les atomes ! à l'intérieur de la boite!..... ! nom du fichier ifich = 'toto.d3' ! pour écrire les résultats sur la console, ! dé-commenter les lignes suivantes ! write(*, '(A, A)') 'fichier:', trim(ifich) ! write(*, '(A, I3, A, I2)') 'nat=', nat, ' et ntype=', ntype ! write(*, '(I3, A, A)') & ! (nati(n), ' atomes appelés ', nom(n), n = 1, ntype) ! write(*, '(A, F10.3, /, & ! & A, F10.3, A, F10.3, /, & ! & A, F10.3, A, F10.3, A, F10.3)') & ! 'dxx=', dxx, & ! 'dyx=', dyx, ' dyy=', dyy, & ! 'dzx=', dzx, ' dzy=', dzy, ' dzz=', dzz ! write(*, '(I3, 1X, F10.3, 5X, F10.3, 5X, F10.3)') & ! (n, x(n), y(n), z(n), n = 1, nat) ! écriture du fichier open(unit, file = ifich, form = 'unformatted', action = 'write') write(unit) titre write(unit) nat, ntype write(unit) nati, nom write(unit) dxx, dyx, dyy, dzx, dzy, dzz write(unit) x write(unit) y write(unit) z close(unit) end program d3 ###############################################################################